<?php

namespace Mogod\Core\Model\Scheme\Storage;

require_once __DIR__ . '/ModelSchemeStorageAbstract.php';

/**
 * Стандартное хранилище аннотаций схемы моделей. Сохраняет схемы в файл
 *
 * @author morph, goorus
 */
class ModelSchemeStorageStandart extends ModelSchemeStorageAbstract
{
	/**
	 * Путь до директория хранилища аннотаций
	 *
	 * @var string
	 */
	protected $path;

	/**
	 * Сформировать имя файла аннотации для модели
	 *
	 * @param string $modelName
	 * @return string
	 */
	protected function filename($modelName)
	{
		return rtrim($this->path, '/') . '/' . $modelName;
	}

	/**
	 * Получить директорию сохранения аннотаций
	 *
	 * @return string
	 */
	public function getPath()
	{
		return $this->path;
	}

	/**
	 * @inheritdoc
	 */
	public function loadScheme($modelName)
	{
		$filename = $this->filename($modelName);
		if (is_file($filename)) {
			return $this->unserialize(
				file_get_contents($filename)
			);
		}
	}

	/**
	 * @inheritdoc
	 */
	public function saveScheme($modelName, $scheme)
	{
		$filename = $this->filename($modelName);
		file_put_contents(
			$filename, $this->serialize($scheme)
		);
	}

	/**
	 * Сериализация схемы моделей
	 *
	 * @param array $scheme
	 * @return string
	 */
	protected function serialize($scheme)
	{
		return json_encode($scheme);
	}

	/**
	 * Изменить директорию сохранения аннотаций
	 *
	 * @param string $path
	 */
	public function setPath($path)
	{
		$this->path = $path;
	}

	/**
	 * Десериализация схемы моделей
	 *
	 * @param string $data
	 * @return array
	 */
	protected function unserialize($data)
	{
		return json_decode($data, true);
	}
}